/**
 * Universidad del Valle de Guatemala
 * CC2003 - Algoritmos y Estructuras de Datos
 * HOJA DE TRABAJO #2
 * Oscar Antonio González Natareno 10277
 * @author Oscar G
 * @param <E> 
 */

public class Stack<E> implements NuestroStack<E> {
   
    /* ATRIBUTOS DE LA CLASE STACK */
    protected Node<E> tope;
    protected int tamaño;
    
    /* CONSTRUCTOR DE LA CLASE STACK (PREDEFINIDO) */
    // SE INICIALIZAN LOS ATRIBUTOS DE LA CLASE STACK Y SE CREA UN NUEVO STACK VACÍO.
    public Stack() {
        tope = null;
        tamaño = 0;
    }
           
    
    /* MÉTODO SIZE */
    /**
     * Indica el tamaño de la pila.
     * @return Tamaño de la pila (int). 
     */
    public int size() {
        return tamaño;
    }
    
    /* MÉTODO ISEMPTY */
    /**
     * Informa al usuario si el Stack se encuentra vacío. 
     * @return True si el Stack está vacío, False si el Stack no se encuentra vacío.
     */
    public boolean isEmpty() {
        if(tope == null) 
            return true;
        return false;
    }
    
    /* MÉTODO PUSH */
    /**
     * Informa al usuario sobre el primer elemento del Stack.
     * @return Primer elemento del Stack.
     */
    public void push(E elemento) {
        Node<E> v = new Node<E>(elemento, tope);
        tope = v;
        tamaño++;
    }
    
    /* MÉTODO POP */
     /**
     * Remueve el elemento de la parte superior del Stack.
     * @return Elemento removido del Stack.
     * @throws StackVacioException si el Stack se encuentra vacío.
     */
    public E pop() throws StackVacioException {
        if (isEmpty()) {
            throw new StackVacioException("CUIDADO, EL STACK ESTÁ VACÍO");
        }
        E temporal = tope.getElemento();
        tope = tope.getSiguiente();
        tamaño--;
        return temporal;
    }    
} // FIN DE LA CLASE STACK 
